package com.github.yangyishe;

/**
 * 1343. 大小为 K 且平均值大于等于阈值的子数组数目
 * https://leetcode.cn/problems/number-of-sub-arrays-of-size-k-and-average-greater-than-or-equal-to-threshold/
 *
 * 给你一个整数数组 arr 和两个整数 k 和 threshold 。
 *
 * 请你返回长度为 k 且平均值大于等于 threshold 的子数组数目。
 *
 *
 *
 * 示例 1：
 *
 * 输入：arr = [2,2,2,2,5,5,5,8], k = 3, threshold = 4
 * 输出：3
 * 解释：子数组 [2,5,5],[5,5,5] 和 [5,5,8] 的平均值分别为 4，5 和 6 。其他长度为 3 的子数组的平均值都小于 4 （threshold 的值)。
 * 示例 2：
 *
 * 输入：arr = [11,13,17,23,29,31,7,5,2,3], k = 3, threshold = 5
 * 输出：6
 * 解释：前 6 个长度为 3 的子数组平均值都大于 5 。注意平均值不是整数。
 *
 *
 * 提示：
 *
 * 1 <= arr.length <= 105
 * 1 <= arr[i] <= 104
 * 1 <= k <= arr.length
 * 0 <= threshold <= 104
 */
public class Problem1343 {
    public static void main(String[] args) {
        int[] arr=new int[]{11,13,17,23,29,31,7,5,2,3};
        int k=3;
        int threhold=5;

        Problem1343 problem1343 = new Problem1343();
        int i = problem1343.numOfSubarrays(arr, k, threhold);
        System.out.println(i);

    }

    public int numOfSubarrays(int[] arr, int k, int threshold) {
        int standard=k*threshold;
        int left=0;
        int right=0;
        int sum=0;

        int resultCount=0;
        // 循环类操作, 应找到核心业务判断处理节点
        // 本循环体的业务操作节点应满足要求:right-left+1<=k, 且sum容纳的元素数之和应<=k个. 同时需要满足遍历次数完全.
        while(right<arr.length){
            // 窗口增加维护. 增加右部元素
            sum+=arr[right];

            // 业务处理区
            if(right-(left-1)==k&&sum>=standard){
                resultCount++;
            }

            // 左索引判断增加. 如果右索引比左索引大k-1, 也就是说, 从左索引到右索引的元素个数, 为k个时, 左索引需要增加, 因为右索引马上要增加. 此处属于预判
            if(right-(left-1)>=k){
                // 窗口删除维护: 去除当前的左索引元素
                sum-=arr[left];
                left++;
            }

            // 此处不能写判断逻辑, 因为左右索引这时的位置是不正确的

            // 右索引增加.
            right++;


        }

        return resultCount;
    }
}
